package com.cn.wx.servlet.backnews;

import com.cn.wx.model.NewsModel;
import com.cn.wx.service.NewsService;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

@WebServlet("/newsSave")
public class NewsSaveServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //       1.拿到页面传递过来的数据
//      下面两句话解决乱码问题
        req.setCharacterEncoding("UTF-8");//请求的时候设置编码：页面将数据发送到后台
        resp.setCharacterEncoding("UTF-8");//响应的时候设置编码：后台将数据发送到页面
        String title = req.getParameter("title");
        String introduction = req.getParameter("introduction");
        String id = req.getParameter("id");
//        判断id是否有值
        Integer ids = id == null || id.equals("") ? 0 : Integer.parseInt(id);
//        2.封装实体类
        NewsModel newsModel = new NewsModel();
        newsModel.setId(ids);
        newsModel.setTitle(title);
        newsModel.setIntroduction(introduction);
//        3.调用业务逻辑层service
        NewsService newsService = new NewsService();
        //ids为0表示页面是跳转到新增页面，否则ids里面有值就表示修改
        if (ids == 0) {
            newsService.add(newsModel);
        } else {
            newsService.update(newsModel);
        }
        /**
         * 主要做图片上传
         */
//设定我们图片保存的路径
//        String path = "D:\\upload\\a\\b\\c\\";
        String pa="/upload/";
        String path=this.getServletContext().getRealPath(pa);
//        这里要用IO流
        File file = new File(path);
//        如果比较严谨的情况下，我们需要对path进行判断，判断我们的路径是否存在，如果不存在，则创建
        if (!file.isDirectory() && !file.exists()) {
            file.mkdirs();//创建文件，无论是否存在多个空文件夹
        }
//        拿到页面传递过来的东西，Tomcat自带文件上传的类DiskFileItemFactory
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
// 文件解析器ServletFileUpload
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
        String fileName = "";
//        判断是否为正确的上次文件类型multipart/form-data
        if (ServletFileUpload.isMultipartContent(req)) {
            try {
//                将表单中每个输入对象封装成FileItem
                List<FileItem> list = servletFileUpload.parseRequest(req);
//                for (int i=0;i<list.size();i++){}
                for (FileItem fileItem : list) {
//如果得到的是普通FileItem，我们就不管，如果是文件，我们需要存储
                    if (fileItem.isFormField()) {
                        System.out.println(fileItem.getFieldName() + "++++++++");
                    } else {
                        System.out.println(fileItem.getFieldName() + "------");
                        /**
                         * 这里已经拿到我们所需要的文件
                         * 1.我们需要文件的名字
                         * 2.我们需要文件的大小
                         */
                        fileName = fileItem.getName();
//                       得到文件大小的目的就是为了告诉前端文件太大不能上传
//                        或者我们可以对文件大小设置一个区间
                        Long fileSize = fileItem.getSize();
//                        得到文件的输入流，即读取文件
                        InputStream inputStream = fileItem.getInputStream();
//                        需要创建一个文件的输出流，即我们需要将文件写入硬盘
//                        并提供写入硬盘的地址，name为一个完整的地址，即地址+文件名
                        FileOutputStream fileOutputStream = new FileOutputStream(path + fileName);
                        byte[] bytes = new byte[1024];//每次读取1024个字节
                        int len = 0;
                        while ((len = inputStream.read(bytes)) != -1) {
                            fileOutputStream.write(bytes, 0, len);
                        }
                        inputStream.close();
                        fileOutputStream.close();
                        fileOutputStream.flush();
                        fileItem.delete();//将内存里面的临时文件删除

                    }
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            }

        } else {
//            长传类型不正确
            return;
        }
//        4.返回页面，如果要传递数据到页面，用转发，如果不用传递数据，直接跳转
//        resp.sendRedirect("/newsFindAll");//跳转到用户管理页面，等于我们要去重新查询一次
        req.setAttribute("path", pa + fileName);
        req.getRequestDispatcher("/newsFindAll").forward(req, resp);
    }
}
